<?php
// +----------------------------------------------------------------------
// | HisiPHP框架[基于ThinkPHP5.1开发]
// +----------------------------------------------------------------------
// | Copyright (c) 2016-2021 http://www.HisiPHP.com
// +----------------------------------------------------------------------
// | HisiPHP承诺基础框架永久免费开源，您可用于学习和商用，但必须保留软件版权信息。
// +----------------------------------------------------------------------
// | Author: 橘子俊 <364666827@qq.com>，开发者QQ群：50304283
// +----------------------------------------------------------------------

namespace app\common\service;

use app\common\service\Base;
use app\common\service\TTask as TTaskService;

/**
 * 任务/评论资源权限控制类
 * @author King
 *
 */
class TTaskRights extends Base
{

	protected $rightsAll = [];

	public function __construct() {
		$this->rightsAll = config('mimo.task_rights');
	}

	/**
	 * 获取当前用户在某个任务中所处的角色
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId	任务ID
	 * @return integer	0未知，1创建人，2管理员，3普通成员，4只读成员
	 */
	public function getTaskRoleId($taskId) {
		if(IS_ROOT) return 1;
		if (empty($taskId)) return 0;
		$ttInfo = (new TTaskService())->getInfoById($taskId, 'project_id,admin_id');
		if ($ttInfo) {
			if ($ttInfo['admin_id'] == ADMIN_ID) return 1;
			return db('t_project_user')->where('project_id', $ttInfo['project_id'])->where('admin_id', ADMIN_ID)->value('type', 0);
		} else return 0;
	}

	/**
	 * 检测是否可编辑
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 *
	 */
	public function checkCanEdit($taskId, $roleId=null) {
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			return arrayGet($rights, 'task_edit', 0);
		} else return 0;
	}

	/**
	 * 检测是否可关注
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCanAttention($taskId, $roleId=null){
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			return arrayGet($rights, 'task_attention', 0);
		} else return 0;
	}

	/**
	 * 检测是否可删除
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCanDel($taskId, $roleId=null) {
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			return arrayGet($rights, 'task_delete', 0);
		} else return 0;
	}

	/**
	 * 检测是否可修改状态（移动）
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCanChangeStatus($taskId, $roleId=null) {
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			return arrayGet($rights, 'task_status', 0);
		} else return 0;
	}

	/**
	 * 检测是否可修改进度信息
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCanChangeProgress($taskId, $roleId=null) {
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			$can = arrayGet($rights, 'task_progress', 0);
			if (!$can) {
				$ttpInfo = db('t_task_progress')->where('task_id', $taskId)->order('create_time desc')->limit(1)->findOrEmpty();
				if ($ttpInfo && ($ttpInfo['admin_id'] == ADMIN_ID || in_array(ADMIN_ID, explode(',', $ttpInfo['assist_admin_ids'])))) {
					return 1;
				} else return 0;
			} else return 1;
		} else return 0;
	}

	/**
	 * 检测是否可评论
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $taskId		任务ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCommentCreate($taskId, $roleId=null) {
		if(IS_ROOT) return 1;
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			return arrayGet($rights, 'comment_create', 0);
		} else return 0;
	}

	/**
	 * 检测是否可编辑评论
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $commentId	评论ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCommentEdit($commentId, $roleId=null) {
		if(IS_ROOT) return 1;
		$ttcInfo = db('t_task_comment')->where($commentId, $commentId)->findOrEmpty();
		if (empty($ttcInfo)) return 0;

		$taskId = $ttcInfo['task_id'];
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			if ($ttcInfo['admin_id'] == ADMIN_ID) {	// 自已评论
				return arrayGet($rights, 'comment_edit', 0);
			} else {
				return arrayGet($rights, 'other_comment_edit', 0);
			}
		} else return 0;
	}

	/**
	 * 检测是否可删除评论
	 *
	 * @author King
	 * @date 2020年8月21日
	 *
	 * @param integer $commentId	评论ID
	 * @param integer $roleId		任务角色ID
	 */
	public function checkCommentDel($commentId, $roleId=null) {
		if(IS_ROOT) return 1;
		$ttcInfo = db('t_task_comment')->where($commentId, $commentId)->findOrEmpty();
		if (empty($ttcInfo)) return 0;

		$taskId = $ttcInfo['task_id'];
		if ($roleId === null) $roleId = $this->getTaskRoleId($taskId);
		if ($roleId) {
			$rights = arrayGet($this->rightsAll, $roleId, []);
			if ($ttcInfo['admin_id'] == ADMIN_ID) {	// 自已评论
				return arrayGet($rights, 'comment_delete', 0);
			} else {
				return arrayGet($rights, 'other_comment_delete', 0);
			}
		} else return 0;
	}
}